Ruby 日記 46日目: クラスの継承とスコープ
次のプログラムを実行するとどうなりますか
code:main.rb
class Base
def name
p 'Base#name'
end
end
module Scope
class Base
def name
p 'Scope::Base#name'
end
end
class Inherited < Base
def name
p 'Scope::Inherited#name'
super
end
end
end
inherited = Scope::Inherited.new
inherited.name
選択肢:
code:sh
"Scope::Base#name"
"Scope::Inherited#name"
code:sh
"Base#name"
"Scope::Base#name"
code:sh
"Scope::Inherited#name"
"Scope::Base#name"
code:sh
"Scope::Inherited#name"
"Base#name"
解説:
クラスの継承とスコープに関する問題っぽいね。
Scope モジュール内に定義された Inherited クラスは、
Scope モジュール内に定義された Base クラスを継承している。
Scope モジュール内に定義された Inherited クラス内の name メソッドは super メソッドを呼んでいるから、
Scope モジュール内に定義された Base クラス内の name メソッドが呼ばれる。
なので p 'Scope::Inherited#name' → p 'Scope::Base#name' という順番で処理されるはず。
code:bash
# ruby gold/ex46/main.rb
"Scope::Inherited#name"
"Scope::Base#name"
正解は3番目の選択肢だね。